package gruppoSoluzione.mainService;

import gruppoSoluzione.mainService.services.HttpFileServer;

import java.io.DataOutputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import server.IHTTPServer;

/**
 * Un Server HTTP configurabile, basato sul Design Pattern Strategy e sull'interfaccia 
 * che astrae sulle strategie 'HTTPService'.
 * 
 * Responsabilità : decidere (sulla base di una logica opportuna) quale servizio utilizzare 
 * ed invocarlo. 
 * 
 * @author Alessandro Martinelli
 */
public class MainHttpServer implements IHTTPServer{
	
	private HashMap<String, HTTPService> services=new HashMap<String, HTTPService>();
	
	private HttpFileServer fileServerService;
	
	private String service;
	private String params="";

	@Override
	public ArrayList<String> elaboraRispostaHTTP(List<String> richiestaHTTP, DataOutputStream out) {
		String uri = findUri(richiestaHTTP);
		System.err.println("uri:"+uri);
		evalServiceInfo(uri);
		
		ServiceParams serviceParams=new ServiceParams(params);
		
		HTTPService httpService=services.get(service);
		if(httpService==null){
			httpService=fileServerService;
			serviceParams.addParam("file", service);
		}
		
		return httpService.getServiceResult(serviceParams, out);
	}

	private void evalServiceInfo(String uri) {
		String[] uriParts=uri.split("\\?");
		service="none";
		if(uriParts.length>0){
			service=uriParts[0];
			if(uriParts.length>1){
				params=uriParts[1];
			}
		}
	}

	private String findUri(List<String> richiestaHTTP) {
		
		String firstLine=richiestaHTTP.get(0);
		String[] firstLineParts=firstLine.split(" ");
		
		String uriPart=firstLineParts[1];
		String uri=uriPart.substring(uriPart.indexOf("/")+1);
		
		return uri;
	}
	
	/**
	 * Imposta il servizio di File Server, che questo Server utilizza come default.
	 * Tale servizio verrà invocato aggiungendo l'URI ai parametri del servizio,
	 * usando la parola chiave 'file'
	 * 
	 * @param fileServerService
	 */
	public void setFileServerService(HttpFileServer fileServerService) {
		this.fileServerService = fileServerService;
	}
	
	/**
	 * Aggiunge eventuali servizi specifici, dato un nome e una implementazione di HTTPService.
	 * Il servizio verrà utilizzato quando name compare nell'URI
	 * 
	 * @param fileServerService
	 */
	public void addService(String name,HTTPService service){
		services.put(name, service);
	}
}
